iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
Software Development

駕馭編譯舞台:C/C++程式編譯、Makefile與CMake大冒險!系列 第 1

[Day01] 旅途前的準備:一個人上路太危險了,帶上這個吧!

  • 分享至 

  • xImage
  •  

在工作上使用 C/C++ 已經好一段時間,但對於 C/C++ 的編譯一直以來都沒有完全弄懂過,大學時也都是直接使用 Dev C++ 或是 Visual Studio 讓集成開發環境 (IDE) 去處理從源代碼 (Source Code) 到可執行文件 (Executable File) 或是庫文件 (Library) 這段。

對於 Source code 到 Executable File 或 Library 的之間需要經歷哪些步驟,剩下微薄的印象。
貌似在大學時,計算機概論課程有提到過:『源代碼 (Source Code) 經過編譯器 (Compiler),編譯成目標代碼 (Object Code),再經過鏈結器(Linker) 鏈結成可執行文件 (Executable File) 或是庫文件 (Library)』 這類的描述。

嗯,好的,道理我都懂,所以我說那個那隻鴿子為什麼這麼大?

https://ithelp.ithome.com.tw/upload/images/20230916/20161947qhamIdy5d1.png

我是說,道理我都懂,但實務上這些步驟是怎麼實現的,腦海中總是沒有一個清晰的樣貌。

  • 源代碼 (Source Code) 就是我們寫的那些 C/C++ code,但編譯器 (Compiler) 是誰?
  • 目標代碼 (Object Code) 在哪?
  • 鏈結器 (Linker) 又是哪位?
  • 最後生出的可執行文件 (Executable File), a.k.a 程式,為什麼執行的時候老是跳錯誤訊息:『找不到 xxx 庫 (Library)』。
  • 又或是,在 Windows 作業系統上的程式,為什麼放到 Linux 作業系統上不能執行呢?
  • 庫文件 (Library) 又分成了 靜態庫 (Static Library) 與動態庫 (Dynamic Link Library),兩者之間的差異是什麼?
  • 需要做跨平台編譯 (Cross Compilation) 的話,源代碼到可執行檔之間的步驟會有不一樣嗎?

余憶童稚時 ,大學的系統程式課程中還介紹了組譯器 (Assembler)、連結器 (Linker)、載入器 (Loader)、巨集處理器 (Macro Processor)、編譯器 (Compiler)。
在實務上,他們都是哪些東西呢?

一直以來都是一個不求甚解的態度去面對這些問題,藉由這次的 IT 鐵人賽,打算好好來搞懂這些十萬個為什麼,究竟是什麼。

不過,一個人上路太危險了,帶上這個吧!(X

https://ithelp.ithome.com.tw/upload/images/20230916/20161947ZMYioK4Aol.jpg

讓小鼠鼠 (?) 陪你展開這段探究 C/C++ 生老病死的旅程,認識從撰寫到編譯再到可執行程式或庫文件,一路上遇到的各種熟悉的陌生人們。

本系列文章預計範疇為: 先弄懂 C/C++ 編譯流程中的各個專有名詞與其所扮演的角色,會稍微提到一些小時候在大學課堂上聽過的東西,然後以 Linux 為目標平台,先了解 Makefile 的撰寫規則,再進一步使用 CMake 作為建構系統,實現在 Linux 與 Windows 上都能編譯的程式範例。

以實例搭配小時候學的理論,帶你走進 C/C++ 程式的編譯舞台,解析編譯的神秘面紗,揭開程式背後的編譯秘密。


下一篇
[Day02] 踏上冒險之旅:探索C/C++程式編譯世界
系列文
駕馭編譯舞台:C/C++程式編譯、Makefile與CMake大冒險!2
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言